/**********************************************************************
 * Filename: Estadio.java
 * Created: 2012/04/30
 * @author Fernando Brito e Abreu
 **********************************************************************/
package org.quasar.CopaPaises.businessLayer;

import java.util.Set;
import java.util.HashSet;

public class Estadio {
	public static Set<Estadio> allInstances = new HashSet<Estadio>();

	private int inauguracao;
	private int lotacao;
	private String nome;
	private Cidade cidade;

	/**********************************************************************
	 * Default constructor
	 **********************************************************************/
	public Estadio() {
		allInstances.add(this);
	}

	/**********************************************************************
	 * Parameterized constructor
	 * 
	 * @param inauguracao
	 *            the inauguracao to initialize
	 * @param lotacao
	 *            the lotacao to initialize
	 * @param nome
	 *            the nome to initialize
	 * @param cidade
	 *            the cidade to initialize
	 **********************************************************************/
	public Estadio(int inauguracao, int lotacao, String nome, Cidade cidade) {
		this.inauguracao = inauguracao;
		this.lotacao = lotacao;
		this.nome = nome;
		this.cidade = cidade;
		allInstances.add(this);
	}

	/**********************************************************************
	 * Standard attribute getter
	 * 
	 * @return the inauguracao of the estadio
	 **********************************************************************/
	public int inauguracao() {
		return inauguracao;
	}

	/**********************************************************************
	 * Standard attribute setter
	 * 
	 * @param inauguracao
	 *            the inauguracao to set
	 **********************************************************************/
	public void setInauguracao(int inauguracao) {
		this.inauguracao = inauguracao;
	}

	/**********************************************************************
	 * Standard attribute getter
	 * 
	 * @return the lotacao of the estadio
	 **********************************************************************/
	public int lotacao() {
		return lotacao;
	}

	/**********************************************************************
	 * Standard attribute setter
	 * 
	 * @param lotacao
	 *            the lotacao to set
	 **********************************************************************/
	public void setLotacao(int lotacao) {
		this.lotacao = lotacao;
	}

	/**********************************************************************
	 * Standard attribute getter
	 * 
	 * @return the nome of the estadio
	 **********************************************************************/
	public String nome() {
		return nome;
	}

	/**********************************************************************
	 * Standard attribute setter
	 * 
	 * @param nome
	 *            the nome to set
	 **********************************************************************/
	public void setNome(String nome) {
		this.nome = nome;
	}

	/**********************************************************************
	 * ONE2MANY getter for Estadio[*] <-> Cidade[1]
	 * 
	 * @return the cidade of the estadio
	 **********************************************************************/
	public Cidade cidade() {
		return cidade;
	}

	/**********************************************************************
	 * ONE2MANY setter for Estadio[*] <-> Cidade[1]
	 * 
	 * @param cidade
	 *            the cidade to set
	 **********************************************************************/
	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}

	/**********************************************************************
	 * ONE2MANY getter for Estadio[1] <-> Jogo[*]
	 * 
	 * @return the jogos of the estadio
	 **********************************************************************/
	public Set<Jogo> jogos() {
		Set<Jogo> result = new HashSet<Jogo>();
		for (Jogo x : Jogo.allInstances)
			if (x.estadio() == this)
				result.add(x);
		return result;
	}

	/**********************************************************************
	 * ONE2MANY setter for Estadio[1] <-> Jogo[*]
	 * 
	 * @param jogos
	 *            the jogos to set
	 **********************************************************************/
	public void setJogos(Set<Jogo> jogos) {
		for (Jogo x : jogos)
			x.setEstadio(this);
	}

	/**********************************************************************
	 * User-defined operation specified in SOIL/OCL
	 * 
	 * @param nome
	 *            the nome to set
	 * @param inauguracao
	 *            the inauguracao to set
	 * @param lotacao
	 *            the lotacao to set
	 * @param cidade
	 *            the cidade to set
	 **********************************************************************/
	public void inicializa(String nome, int inauguracao, int lotacao,
			Cidade cidade) {

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	/**********************************************************************
	 * Object serializer
	 **********************************************************************/
	public String toString() {
		return "Estadio [inauguracao=" + inauguracao + ", lotacao=" + lotacao
				+ ", nome=" + nome + ", cidade=" + cidade + "]\n";
	}

	/**********************************************************************
	 * getter
	 * 
	 * @return the number of jogos in the estadio
	 **********************************************************************/
	public int getNumeroJogos() {
		int aux = 0;
		for (Jogo x : jogos())
			if (x.estadio() == this)
				aux++;
		return aux;

	}

}
